package core

import (
	"strings"
)

// IpInfo 存储IP地址的详细信息
type IpInfo struct {
	CountryName   string `json:"country_name"`   // 国家名称
	RegionName    string `json:"region_name"`    // 地区/省份名称
	CityName      string `json:"city_name"`      // 城市名称
	DistrictName  string `json:"district_name"`  // 区/县名称
	OwnerDomain   string `json:"owner_domain"`   // 所有者域名
	IspDomain     string `json:"isp_domain"`     // ISP运营商域名
	CountryCode   string `json:"country_code"`   // 国家代码(ISO 3166-1 alpha-2)
	ContinentCode string `json:"continent_code"` // 大洲代码
}

// NewIpInfo 创建新的空IpInfo实例
func NewIpInfo() *IpInfo {
	return &IpInfo{}
}

// NewIpInfoFull 全构造函数，一次性初始化所有字段
func NewIpInfoFull(
	countryName string,
	regionName string,
	cityName string,
	districtName string,
	ownerDomain string,
	ispDomain string,
	countryCode string,
	continentCode string,
) *IpInfo {
	return &IpInfo{
		CountryName:   countryName,
		RegionName:    regionName,
		CityName:      cityName,
		DistrictName:  districtName,
		OwnerDomain:   ownerDomain,
		IspDomain:     ispDomain,
		CountryCode:   countryCode,
		ContinentCode: continentCode,
	}
}

// MapToInfo 将map[string]string转换为IpInfo
func MapToInfo2Ipinfo(data map[string]string) IpInfo {
	// 创建一个key大小写不敏感的map
	lowerData := make(map[string]string)
	for k, v := range data {
		lowerData[strings.ToLower(k)] = v
	}

	return IpInfo{
		CountryName:   getValue(lowerData, "country_name"),
		RegionName:    getValue(lowerData, "region_name"),
		CityName:      getValue(lowerData, "city_name"),
		DistrictName:  getValue(lowerData, "district_name"),
		OwnerDomain:   getValue(lowerData, "owner_domain"),
		IspDomain:     getValue(lowerData, "isp_domain"),
		CountryCode:   getValue(lowerData, "country_code"),
		ContinentCode: getValue(lowerData, "continent_code"),
	}
}

// getValue 从map中获取值，处理key大小写问题
func getValue(data map[string]string, key string) string {
	if val, ok := data[key]; ok {
		return val
	}
	return ""
}

// SetCountry 设置国家信息
func (i *IpInfo) SetCountry(name, code string) *IpInfo {
	i.CountryName = name
	i.CountryCode = code
	return i
}

// SetRegion 设置地区信息
func (i *IpInfo) SetRegion(region string) *IpInfo {
	i.RegionName = region
	return i
}

// SetCity 设置城市信息
func (i *IpInfo) SetCity(city, district string) *IpInfo {
	i.CityName = city
	i.DistrictName = district
	return i
}

// SetDomains 设置域名信息
func (i *IpInfo) SetDomains(owner, isp string) *IpInfo {
	i.OwnerDomain = owner
	i.IspDomain = isp
	return i
}

// SetContinent 设置大洲信息
func (i *IpInfo) SetContinent(code string) *IpInfo {
	i.ContinentCode = code
	return i
}
